// 需要柯里化的指定函数
const sum = (a, b, c, d) => a + b + c + d;
// 需要一个柯里化的函数，支持以下结果，结果不变
console.log(currying(sum)(1)(2)(3)(4))
console.log(currying(sum, 1)(2)(3)(4))
console.log(currying(sum)(1, 2)(3)(4))

// 传入一个函数，以及可选参数
function currying(fn, ...bindArgs) {
    // 返回一个不定参数的函数
    return (...args) => {
        // 计算参数数量
        const allArgs = [...bindArgs, ...args];
        // 如果参数数量小于给定函数所需要的参数数量，继续调用
        if (allArgs.length < fn.length) {
            return currying(fn, ...allArgs);
        } else {
            // 参数够了的话就执行指定函数
            return fn(...allArgs);
        }
    }
}